#include <iostream>
#include <string>
#include <vector>

#include "friend.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"
#include "logger.h"

// 2. 继承.proto文件中service类型的名称，这里就是GetFriendListRpc
class FriendService : public fixbug::GetFriendListRpc
{
public:
    // 1. 先定义本地服务
    std::vector<std::string> GetFriendList(uint32_t id)
    {
        LOG_INFO("enter FriendService::GetFriendList(uint32_t id = %d)", id);
        // 这里为了模拟，粗糙地伪造一些数据
        return {"pan hong", "xiao ci lao", "luo xiang"};
    }

    // 3. 重写基类方法
    virtual void GetFriendList(::google::protobuf::RpcController *controller,
                               const ::fixbug::GetFriendListRequest *request,
                               ::fixbug::GetFriendListResponse *response,
                               ::google::protobuf::Closure *done)
    {
        // 模拟处理rpc请求
        uint32_t id = request->userid();

        std::vector<std::string> ret = GetFriendList(id);

        response->mutable_result()->set_errorno(0);
        response->mutable_result()->set_errmsg("");

        for(std::string &name : ret)
        {
            std::string *p = response->add_friends();
            *p = name;
        }

        done->Run();
    }

private:
};

int main(int argc, char *argv[])
{

    // 调用框架的初始化操作
    MprpcApplication::Init(argc, argv);

    // provider是一个rpc网络服务对象
    RpcProvider provider;

    // 把FriendService对象发布到rpc节点上
    provider.NotifyService(new FriendService());

    // 启动一个rpc服务节点，此后进入阻塞状态，等待远程的rpc调用
    provider.Run();
    return 0;
}